package com.kirayous.gulimall.order.config;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
/**
 * @author KiraYous
 * @version V1.0
 * @Package com.kirayous.gulimall.member.config
 * @date 2022/4/4 6:43
 */
@Configuration
public class MyFeignConfig {

    //解决远程调用cookie同步问题
    @Bean("requestInterceptor")
    public RequestInterceptor requestInterceptor(){

        // 这里相当于new一个RequestInterceptor匿名内部类，重写了apply方法
        //而传递一个RequestTemplate 对象，这个对象是每次feign发送请求自动新创建的一个对象
        //我们需要做的就是再这个tempalte设置一个新的对象。
        return template -> {
            //1、RequestContextHolder拿到刚进来的这个请求
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            if(attributes!=null){
                System.out.println("RequestInterceptor线程...."+Thread.currentThread().getId());
                HttpServletRequest request = attributes.getRequest(); //老请求，思考一下这是如何做到能够获取到当前上下文的request的？
                                                                     //实际上这RequestContextHolder也是从ThreadLocal中获取的，也就是说每一个线程都保存好了他自己的上下文，如果当前代码是在同一个线程中运行，那么获取到的request也是同一个
                if(request != null){
                    //同步请求头数据，Cookie
                    String cookie = request.getHeader("Cookie");
                    //给新请求同步了老请求的cookie
                    template.header("Cookie",cookie);
                }
            }
        };
    }
}
